function my_instanceof(obj, Obj) {
    let obj_proto = obj.__proto__;
    let obj_proto_type = Obj.prototype;
    while (true) {
        if (obj_proto == null) {
            return false;
        } else if (obj_proto == obj_proto_type) {
            return true;
        }
        obj_proto = obj_proto.__proto__
    }
}

// new 的本质是什么

// 创建一个新的对象
// 将构造函数的作用域赋值给这个新的对象（因此this指向了这个新的对象）
// 执行构造函数中的代码（为这个新对象添加属性）
// 返回新对象

// 1. 创建一个对象 `const obj = {}`
// 2. 设置新对象的 `constructor` 属性为构造函数的名称，设置新对象的`__proto__`属性指向构造函数的 `prototype` 对象
//    ```js
//    obj.constructor = Test;
//    obj.__proto__ = Test.prototype;
//    ```
// 3. 使用新对象调用函数，函数中的 this 被指向新实例对象 `Test.call(obj)`
// 4. 将初始化完毕的新对象地址，保存到等号左边的变量中

// ???
// function my_new(func) {
//     let fn = {};
//     fn.prototype = func;
//     return fn
// }

function my_new(func, ...args) {
    let funcpro = Object.create(func.prototype); // funcpro.__proto__ = func.prototype
    func.apply(funcpro, args)
    return funcpro
}

function myNew(){
    var obj = {}
    var constructorFunction = [].shift.call(arguments)
    obj.__proto__ = constructorFunction.prototype
    var params = arguments
    var res = constructorFunction.apply(obj, params)
  
    return res instanceof Object ? res : obj
  }


